/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.schnipsel.db;

import de.mnit.basis.daten.MN;
import de.mnit.basis.db.konstant.DBMS;
import de.mnit.basis.db.sql.HSQLDB;
import de.mnit.basis.db.sql.MySQL;
import de.mnit.basis.db.sql.S_SqlDB;
import de.mnit.basis.db.sys3e.e1_basis.A_E1_Manager_Basis;
import de.mnit.basis.db.zugang.S_DBZugang;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_DB;
import de.mnit.basis.swt.dialog.SWT_Dialog;
import de.mnit.basis.sys.EinmalStart;
import de.mnit.basis.sys.sprache.S;
import de.mnit.schnipsel.swt.dialog.Dialog_Fortschritt;
import de.mnit.schnipsel.zentral.SC_Events;
import de.mnit.schnipsel.zentral.SC_GuiObs;
import de.mnit.schnipsel.zentral.SC_Info;


/**
 * @author Michael Nitsche
 */
public class DBManager extends A_E1_Manager_Basis {

	private static final S s=new S(DBManager.class);
	private static DBManager instanz=null;
	private S_DBZ_Schnipsel tabSchnipsel;
	private S_DBZ_Baum tabBaum;
	private DBZ_Konfig tabKonfig;


	public DBManager(DBMS db) {
		super(db);
	}


	public static void verbinden() {
		if(instanz!=null)
			instanz.schliessen();

		Dialog_Fortschritt dialog=new Dialog_Fortschritt(s.t("Datenbank laden!"));
		dialog.oeffnen(SC_GuiObs.i().hauptfenster());
		dialog.setze(1, 4);
		try {
			DBKonfig konfig=new DBKonfig();
			int nr=1;
			S_DBZugang z = konfig.gib(nr);
			dialog.weiter();
			if(z.gDBMS()==DBMS.HSQLDB && !MN.istGefuellt(z.gHost())) {
				if(EinmalStart.laeuftBereits(7571)) {
					SC_Info.infoDBAbbruch();
					System.exit(1);
				}
			}
			dialog.weiter();

			instanz=new DBManager(z.gDBMS());
			instanz.verbinden(z);
			dialog.weiter();

			if(z.gDBMS()==DBMS.MYSQL)
				instanz.direkt().befehl("SET SESSION sql_mode='NO_BACKSLASH_ESCAPES'"); //[GLOBAL
			dialog.schliessen();
		}
		catch(Exception e) {
			dialog.schliessen();
			Fehler.zeig(e, false);
			SWT_Dialog.warnung("Verbindung zur Datenbank konnte nicht hergestellt werden");
			SC_Events.konfig();
		}
	}

	public static DBManager i() {
		Fehler.objekt.wenn_Null(instanz);
		return instanz;
	}

	public static S_DBZ_Schnipsel	schnipsel()	{ return i().tabSchnipsel(); }
	public static S_DBZ_Baum		baum()		{ return i().tabBaum(); }
	public static DBZ_Konfig		konfig()	{ return i().tabKonfig(); }

	public S_DBZ_Schnipsel 	tabSchnipsel()	{ return this.tabSchnipsel!=null ? this.tabSchnipsel : (this.tabSchnipsel=new DBZ_Schnipsel(this)); }
	public S_DBZ_Baum 	 	tabBaum()		{ return this.tabBaum!=null ? this.tabBaum : (this.tabBaum=new DBZ_Baum(this)); }
	public DBZ_Konfig 		tabKonfig()		{ return this.tabKonfig!=null ? this.tabKonfig : (this.tabKonfig=new DBZ_Konfig(this)); }

	// GESCHÜTZT

	protected String dbName() {
		return "SCHNIPSEL";
	}

	protected S_SqlDB neuDBMS(S_DBZugang dbz) throws F_Sys_DB {
		try {
			if(dbz.gDBMS()==DBMS.HSQLDB)
				return new HSQLDB(dbz);
			if(dbz.gDBMS()==DBMS.MYSQL)
				return new MySQL(dbz);
			throw Fehler.objekt.da_KlasseUngueltig(dbz.getClass().getName());
		}
		catch(Throwable t) {
			throw Fehler.db.da_Verbindungsfehler(t, s.t("Datenbankfehler! Benutzer vermutlich bereits eingeloggt!"));
		}
	}

}
